﻿using System;
using System.Collections.Generic;
using System.Web.Mvc;

using BolaoDNA.DomainModel;
using BolaoDNA.Services;
using BolaoDNA.WebMvc.ViewModels;

namespace BolaoDNA.WebMvc.Controllers
{
    [Authorize]
    public class BolaoController : Controller
    {
        private readonly BolaoService bolaoService;
        private readonly UsuarioCadastradoService usuarioCadastradoService;
        private readonly InscricaoBolaoService inscricaoBolaoService;
        private readonly PalpiteService palpiteService;
        private readonly JogoService jogoService;
        public BolaoController(BolaoService bolaoService, UsuarioCadastradoService usuarioCadastradoService, InscricaoBolaoService inscricaoBolaoService, PalpiteService palpiteService, JogoService jogoService)
        {
            this.inscricaoBolaoService = inscricaoBolaoService;
            this.usuarioCadastradoService = usuarioCadastradoService;
            this.bolaoService = bolaoService;
            this.palpiteService = palpiteService;
            this.jogoService = jogoService;
        }

        public ActionResult Index()
        {
            return View();
        }

        // Bolao/Details/1
        public ActionResult Details(Int32 id, String msg, BolaoDetailsViewModel viewModel)
        {
            var bolao = bolaoService.SelectById(id);
            //var viewModel = new BolaoDetailsViewModel();
            viewModel.Instance = bolao;

            if (msg == "PalpiteSalvo")
            {
                viewModel.PalpiteSalvo = true;
            }

            // verifico se usuario logado esta inscrito no bolao
            var inscricaoBolao = new InscricaoBolao();
            inscricaoBolao.Bolao.ID = id;
            inscricaoBolao.UsuarioCadastrado = usuarioCadastradoService.SelectByUsername(User.Identity.Name);

            inscricaoBolao = CarregarInscricaoBolao(id, User.Identity.Name);

            if (inscricaoBolao != null) {
                viewModel.IsParticipante = true;
                viewModel.Participante = inscricaoBolao.UsuarioCadastrado.Nome;
                viewModel.Pontos = inscricaoBolao.PontuacaoTotal;

//                IList<Jogo> jogos = jogoService.Select(viewModel.SeusPalpites);


                IList<Palpite> palpitesFull = new List<Palpite>();

                Int32 pageSize = 6;
                var pageIndex = viewModel.SeusPalpites.PageIndex;

                foreach (var jogo in jogoService.TrazerProximosJogos(bolao.Competicao, pageSize, pageIndex)) {
                    IList<Palpite> palpites = palpiteService.Select(inscricaoBolao.ID, jogo.ID);
                    var palpite = new SeusPalpitesGrid.SeusPalpites
                    {
                        Data = jogo.DataHora.ToShortDateString(),
                        Hora = jogo.DataHora.ToShortTimeString(),
                        EquipeCasa = jogo.EquipeCasa.Nome,
                        EquipeVisitante = jogo.EquipeVisitante.Nome,
                        IdJogo = jogo.ID,
                    };

                    if (palpites.Count == 1)
                    {
                        palpite.PalpiteCasa = palpites[0].PlacarCasa;
                        palpite.PalpiteVisitante = palpites[0].PlacarVisitante;
                    }
                    viewModel.SeusPalpites.Palpites.Add(palpite);
                }
            }

            // carrega ranking
            viewModel.Ranking = inscricaoBolaoService.TrazerRanking(inscricaoBolao.Bolao, 10);

            return View(viewModel);
        }

        // Boiao/Ranking
        public ActionResult Ranking(Int32 id)
        {
            Bolao bolao = bolaoService.SelectById(id);
            return View(bolao);
        }

        public ActionResult TotalizarRanking(Int32 id)
        {
            Bolao bolao = bolaoService.SelectById(id);

            bolao.TotalizarRanking();

            bolaoService.Update(bolao);

            return Content("Ranking Totalizado");
        }

        public ActionResult Participar(Int32 id)
        {
            InscricaoBolao inscricaoBolao = CarregarInscricaoBolao(id,User.Identity.Name);
            if (inscricaoBolao == null)
            {
                inscricaoBolao = new InscricaoBolao();
                inscricaoBolao.UsuarioCadastrado = usuarioCadastradoService.SelectByUsername(User.Identity.Name);
                inscricaoBolao.Bolao.ID = id;
                inscricaoBolaoService.Insert(inscricaoBolao);
            }

            return RedirectToAction("Details", new { ID = id });
        }
        public ActionResult Palpitar(Int32 id, Int32 idJogo, Int32? placarCasa, Int32? placarVisitante)
        {
            if (placarCasa == null || placarVisitante == null)
            {
                return RedirectToAction("Details", new { ID = id });

            }
            else
            {

                InscricaoBolao inscricaoBolao = CarregarInscricaoBolao(id, User.Identity.Name);


                var palpites = palpiteService.Select(inscricaoBolao.ID, idJogo);

                if (palpites.Count == 0)
                {
                    var palpite = new Palpite();
                    palpite.Jogo.ID = idJogo;
                    palpite.PlacarCasa = placarCasa;
                    palpite.PlacarVisitante = placarVisitante;
                    palpite.InscricaoBolao = inscricaoBolao;
                    palpiteService.Insert(palpite);
                }
                else if (palpites.Count == 1)
                {
                    var palpite = palpites[0];
                    palpite.PlacarCasa = placarCasa;
                    palpite.PlacarVisitante = placarVisitante;
                    palpiteService.Update(palpite);

                }

                return RedirectToAction("Details", new { ID = id, Msg="PalpiteSalvo" });
            }
        }

        private InscricaoBolao CarregarInscricaoBolao(Int32 id, String username)
        {
            var inscricaoBolao = new InscricaoBolao();
            inscricaoBolao.Bolao.ID = id;
            inscricaoBolao.UsuarioCadastrado = usuarioCadastradoService.SelectByUsername(username);

            IList<InscricaoBolao> inscricoes = inscricaoBolaoService.SelectByFilters(inscricaoBolao);
            if (inscricoes.Count == 1)
            {
                return inscricoes[0];
            }
            else if (inscricoes.Count == 0)
            {
                return null;
            }
            else
            {
                throw new ApplicationException("Mais de uma inscrição no mesmo bolão");
            }
        }

        
    }
}
